import os

import chardet
import pandas as pd
import pyJianYingDraft as draft
import librosa
import soundfile as sf
from combinations.conf import logger

def custom_script_pre():
    # ****** 自定义脚本申明部分 *********
    # 1. 读取D:\模板5_川普锐评\文本\Trump0418.csv,pandas,表头 Contents、Key_words、Number这个三个列的数据
    csv_path = r"D:\模板5_川普锐评\文本\Trump0429.csv"
    with open(csv_path, 'rb') as f:
        result = chardet.detect(f.read())
    data = pd.read_csv(csv_path, encoding=result['encoding'])
    logger.info(f"csv文件,行数{len(data)}")
    return data

def trump_template_5(script, df,i):
    # 2. 读取csv数据,如果行扫描完了
    global new_audio_path
    if i + 1 >= len(df):
        # 如果读完了,则从第一行继续循环
        j = i + 1 - len(df) + 1
    else:
        j = i

    # 1. 先匹配keyword 再匹配 title 再匹配音频
    # i 从1开始,跳过csv文件的表头
    k = j
    while True:
        # 2. 读取csv数据,如果行扫描完了
        if k >= len(df):
            # 如果读完了,则从第一行继续循环
            k = k - len(df)
            continue

        key_words = df.iloc[k]['Key_words']
        logger.info(f"口播对应的主题内容对应的热点关键词: {key_words}")
        key_words_dir = r"D:\模板5_川普锐评\hot_words"
        key_words_folder = os.path.join(key_words_dir, key_words)
        if not os.path.exists(key_words_folder):
            logger.info(f"热点词对应的素材不存在: {key_words}, 继续查找下一个行")
            k += 1
            continue

        # 音频编号
        number = df.iloc[k]['Number']
        logger.info(f"口播音频编号: {number}")
        audio_dir = r"D:\模板5_川普锐评\口播音频"
        audio_files = [f for f in os.listdir(audio_dir) if f.split('_')[0] == str(number)]
        if not audio_files:
            # 2. 如果找不到number对应的前缀音频文件，则跳过该行，不替换素材
            logger.info(f"编号为{number}的口播音频文件不存在，跳过草稿创建")
            k += 1
            continue
        logger.info(f"匹配到的音频文件: {audio_files[0]}")
        # title
        title = df.iloc[k]['Titles']
        logger.info(f"口播对应的主题内容: {title}")
        # 保存音频加速
        speed_audio_dir = '音频加速'
        # 音频加速倍数
        audio_speed = 1.1

        # =====操作空间=====
        # **title内容读出来，替换文本轨道**
        text_track = script.get_imported_track(
            draft.Track_type.text,  # 选取导入的音频轨道
            index=0  # 也可用下标定位, 0表示最底层的同类型轨道
        )
        script.replace_text(
            text_track, 0,  # 选取text_track中下标为0的片段，也即第一个片段
            text=title  # 新的文本内容
        )
        logger.info(f"替换【文本】title: {title}")

        # 读取对应的热点词文件夹下的3张图片路径，三次替换
        image_files = [f for f in os.listdir(key_words_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

        for idx, image_file in enumerate(image_files[:3]):
            new_img_path = os.path.join(key_words_folder, image_file)
            new_material = draft.Video_material(new_img_path)
            original_material = ["tariffs_1.jpg", "tariffs_2.jpg", "tariffs_3.png"]
            script.replace_material_by_name(material_name=original_material[idx], material=new_material)
            logger.info(f"替换【热点图片】素材: {original_material} -> {new_img_path}")

        # **音频加速处理**
        original_audio_path = os.path.join(audio_dir, audio_files[0])
        new_audio_filename = f"{number}_X{audio_speed}_{os.path.basename(audio_files[0])}"
        # 生成新的音频文件路径
        new_audio_path = os.path.join(audio_dir, speed_audio_dir, new_audio_filename)
        if not os.path.exists(new_audio_path):
            os.makedirs(os.path.join(audio_dir, speed_audio_dir), exist_ok=True)
            # 读取音频文件
            y, sr = librosa.load(original_audio_path, sr=44100)  # 设置采样率为44100 Hz

            # 应用加速倍数
            y_fast = librosa.effects.time_stretch(y, rate=audio_speed)

            # 保存加速后的音频文件
            sf.write(new_audio_path, y_fast, sr, format='WAV', subtype='PCM_24')  # 使用高质量的编码器和比特率
            logger.info(f"加速后的音频文件已保存到: {new_audio_path}")
        else:
            logger.info(f"文件 {new_audio_path} 已存在，跳过保存")

        # 保存替换的音频文件路径
        # 这里是用i 不是用j ,也不是k

        # 替换音频
        new_material = draft.Audio_material(new_audio_path)
        original_audio_material = "口播音频.wav"  # 假设原始音频素材名称为 tariffs_1.png
        audio_track = script.get_imported_track(
            draft.Track_type.audio,
            index=3  # 从上往下的，音频是，对号对一下json 文件 中material_id的位置
        )
        script.replace_material_by_seg(track=audio_track, segment_index=0, material=new_material,
                                       handle_extend=[draft.Extend_mode.extend_tail])
        logger.info(f"替换【音频】素材: {original_audio_material} -> {new_audio_path}")
        # 最后一行必须加break,前面有判断
        break
    return new_audio_path



